package org.microframework.base.core.datasource.seata;

import org.microframework.base.core.datasource.DataSourceProxy;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;

import javax.sql.DataSource;

/**
 * Seata配置类
 * 配置Seata与JFinal的整合，支持JFinal ActiveRecord模式下的分布式事务
 */
@Configuration
@ConditionalOnProperty(prefix = "seata", name = "enabled", havingValue = "true", matchIfMissing = false)
public class SeataConfiguration {

    /**
     * 配置JFinal数据源代理
     * 第一层代理：由JFinal提供，用于支持JFinal的本地事务管理和ActiveRecord操作
     */
    @Bean("jfinalDataSourceProxy")
    public DataSourceProxy jfinalDataSourceProxy(@Autowired DataSource dataSource) {
        return new DataSourceProxy(dataSource);
    }

    /**
     * 配置Seata数据源代理
     * 第二层代理：由Seata提供，用于分布式事务管理
     * 
     * 此Bean为实际应用中使用的数据源代理，同时支持JFinal ActiveRecord和Seata分布式事务
     */
    @Primary
    @Bean("dataSource")
    public DataSource dataSource(DataSourceProxy jfinalDataSourceProxy) {
        try {
            // 使用反射方式创建Seata的DataSourceProxy，避免直接依赖
            Class<?> seataProxyClass = Class.forName("io.seata.rm.datasource.DataSourceProxy");
            return (DataSource) seataProxyClass.getConstructor(DataSource.class).newInstance(jfinalDataSourceProxy);
        } catch (Exception e) {
            // 如果Seata未启用或依赖缺失，则返回JFinal代理
            return jfinalDataSourceProxy;
        }
    }
    
    /**
     * Seata分布式事务配置说明
     * 
     * 1. 客户端配置（application.yml或properties）:
     * seata:
     *   enabled: true
     *   application-id: ${spring.application.name}
     *   tx-service-group: micro-group
     *   registry:
     *     type: nacos (或eureka、zookeeper等)
     *     nacos:
     *       server-addr: 127.0.0.1:8848
     *       namespace: 
     *       group: SEATA_GROUP
     *   service:
     *     vgroup-mapping:
     *       micro-group: default
     *     disable-global-transaction: false
     *   config:
     *     type: nacos (或file、apollo等)
     *   data-source-proxy-mode: AT
     *
     * 2. 数据库undo_log表：
     * 每个业务数据库都需要创建undo_log表（用于AT模式）
     * 
     * 3. 使用JFinal ActiveRecord进行数据操作：
     * 配置完成后，可以直接使用JFinal的Db类或Model类进行数据操作
     * 这些操作将被自动纳入分布式事务的管理范围
     */
} 